package com.zf.nio.channel;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

/**
 * 聚集（gather）写入 Channel 是指在写操作时将多个 buffer 的数据写入同一个
 * Channel，因此，Channel 将多个 Buffer 中的数据“聚集（gather）”后发送到 Channel
 * <p>
 * write()方法会按照 buffer 在数组中的顺序，将数
 * 据写入到 channel，注意只有 position 和 limit 之间的数据才会被写入
 *
 * @author Zhou Feng
 */
public class GatherWriteDemo01 {
    public static void main(String[] args) throws IOException {
        FileChannel fileChannel = FileChannel.open(Paths.get("d:\\a.txt"), StandardOpenOption.READ, StandardOpenOption.WRITE);
        ByteBuffer header = ByteBuffer.allocate(128);
        ByteBuffer body = ByteBuffer.allocate(1024);
        header.put("吗".getBytes()).flip();
        body.put("body test".getBytes()).flip();
        ByteBuffer[] bufferArray = { header, body };
        //write()方法会按照 buffer 在数组中的顺序，将数
        //据写入到 channel，注意只有 position 和 limit 之间的数据才会被写入
        fileChannel.write(bufferArray);
        fileChannel.force(true);
        fileChannel.close();
    }
}
